package git.soulbgm.utils;

import javax.crypto.Cipher;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Base64;

/**
 * RSA加密工具类
 * 用于处理RSA加密、解密和密钥对生成的相关操作
 *
 * @author SoulBGM
 * @date 2025-03-03
 */
public class RsaUtils {
    /**
     * RSA 算法名称
     */
    private static final String KEY_ALGORITHM = "RSA";

    /**
     * 使用公钥加密数据
     *
     * @param data      需要加密的原始数据
     * @param publicKey 公钥
     * @return String Base64编码的加密后数据
     * @throws Exception 加密过程中可能出现的异常
     */
    public static String encrypt(String data, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        // 加密后进行Base64编码
        return Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes()));
    }

    /**
     * 使用私钥解密数据
     *
     * @param data       Base64编码的加密数据
     * @param privateKey 私钥
     * @return String 解密后的原始数据
     * @throws Exception 解密过程中可能出现的异常
     */
    public static String decrypt(String data, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        // Base64解码后进行解密
        return new String(cipher.doFinal(Base64.getDecoder().decode(data)));
    }

    /**
     * 将公钥转换为Base64编码的字符串
     *
     * @param publicKey 公钥
     * @return String Base64编码的公钥字符串
     */
    public static String getPublicKeyString(PublicKey publicKey) {
        return Base64.getEncoder().encodeToString(publicKey.getEncoded());
    }
}